package com.bbva.kyfb.kyfbws.converters;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import com.bbva.jee.arq.spring.core.gce.CodigoError;
import com.bbva.jee.arq.spring.core.gce.ExcepcionEjecucionAplicacion;
import com.bbva.kyfb.kyfbdto.firmas.bo.ComponentePutFirma;
import com.bbva.kyfb.kyfbdto.firmas.bo.ConsultaEmpresaAsociadasNifDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.ConsultaEmpresaAsociadasRefDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.DatosPAU;
import com.bbva.kyfb.kyfbdto.firmas.bo.FicheroInfo;
import com.bbva.kyfb.kyfbdto.firmas.bo.FirmaComponente;
import com.bbva.kyfb.kyfbdto.firmas.bo.InfoComponentInDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.InfoOrdenInDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.OrdenMifidInDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.UpdateInfoInDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.UsuarioInfo;
import com.bbva.kyfb.kyfbdto.firmas.errores.Errores_kyfb_servicios;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.ComponentsForSignRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.ITipoFirmaAndNIF;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoComponent;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoComponentRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoDeletedFile;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileAuditRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileCompaniesRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileDetailedRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileMiFIDRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileToDelete;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFilesToDelete;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFilteredSignersRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoOrden;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoReferenceRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoSendNotificationRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoSignersRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoUpdateNumeroAleatorioRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoUserReference;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoUserReferenceMaking;
import com.bbva.kyfb.kyfbdto.firmas.filtros.FilesDeleteInfo;
import com.bbva.kyfb.kyfbutils.constantes.ConstantesFO;
import com.bbva.kyfb.kyfbutils.constantes.UtilFO;
import com.bbva.kyfb.kyfbutils.errores.ValidationUtils;

/**
 * The Class DtoOutToDtoIn.
 */
public final class DtoOutToDtoIn {

	/** The Constant VALIDATION_ERROR. */
	private static final CodigoError VALIDATION_ERROR = Errores_kyfb_servicios.CAMPO_OBLIGATORIO_NO_INFORMADO;
	
	/**
	 * Instantiates a new dto out to dto in.
	 */
	private DtoOutToDtoIn() {
		//Evitamos instanciacion
	}

	/**
	 * Info file mi fid to orden mifid.
	 *
	 * @param infoFileMiFIDRequest the info file mi fid request
	 * @return the orden mifid in dto
	 */
	public static OrdenMifidInDto infoFileMiFIDToOrdenMifid(final InfoFileMiFIDRequest infoFileMiFIDRequest){
		
		ValidationUtils.validate(infoFileMiFIDRequest, VALIDATION_ERROR);
		
		OrdenMifidInDto ordenMifidInDto = new OrdenMifidInDto();
		ordenMifidInDto.setCodigoBanco(infoFileMiFIDRequest.getsCodigoBanco());
		ordenMifidInDto.setCodigoCanal(infoFileMiFIDRequest.getsCanal());
		ordenMifidInDto.setIdioma(String.valueOf(infoFileMiFIDRequest.getsIdioma()));
		ordenMifidInDto.setIdOrdenFirmas(infoFileMiFIDRequest.getsIdOrdenFirmas());
		ordenMifidInDto.setReferencia(infoFileMiFIDRequest.getsReferencia());
		ordenMifidInDto.setTipoOrden(infoFileMiFIDRequest.getsTipoOrden());

		return ordenMifidInDto;

	}

	/**
	 * Info file companies to empresa ref out dto.
	 *
	 * @param info the info
	 * @return the consulta empresa asociadas ref dto
	 */
	public static ConsultaEmpresaAsociadasRefDto infoFileCompaniesToEmpresaRefOutDto(final InfoFileCompaniesRequest info){
		ValidationUtils.validate(info, VALIDATION_ERROR);
		
		ConsultaEmpresaAsociadasRefDto consultaEmpresaAsociadasRefDto = new ConsultaEmpresaAsociadasRefDto();
		consultaEmpresaAsociadasRefDto.setBanco(info.getsBanco());
		consultaEmpresaAsociadasRefDto.setCanal(info.getsCanal());
		consultaEmpresaAsociadasRefDto.setReferencia(info.getsReferencia());
		return consultaEmpresaAsociadasRefDto;
	}

	/**
	 * Info file companies to empresa nif out dto.
	 *
	 * @param info the info
	 * @return the consulta empresa asociadas nif dto
	 */
	public static ConsultaEmpresaAsociadasNifDto infoFileCompaniesToEmpresaNifOutDto(final InfoFileCompaniesRequest info){
		ValidationUtils.validate(info, VALIDATION_ERROR);
		
		ConsultaEmpresaAsociadasNifDto consultaEmpresaAsociadasNifDto = new ConsultaEmpresaAsociadasNifDto();
		consultaEmpresaAsociadasNifDto.setBanco(info.getsBanco());
		consultaEmpresaAsociadasNifDto.setCanal(info.getsCanal());
		consultaEmpresaAsociadasNifDto.setDni(info.getsDNISolicitud());
		consultaEmpresaAsociadasNifDto.setReferencia(info.getsReferencia());
		return consultaEmpresaAsociadasNifDto;

	}

	/**
	 * User reference to files datos pau.
	 *
	 * @param infoUserReference the info user reference
	 * @return the datos pau
	 */
	public static DatosPAU userReferenceToFilesDatosPau(final InfoUserReference infoUserReference) {
		ValidationUtils.validate(infoUserReference, VALIDATION_ERROR);
		
		DatosPAU datosPau = new DatosPAU();
		datosPau.setsBancoInt(infoUserReference.getsBancoInt());
		datosPau.setsCanal(infoUserReference.getsCanal());
		datosPau.setsCodUsuario(infoUserReference.getsCodUsuario());
		datosPau.setsPasswordFisico(infoUserReference.getsPasswordFisico());
		datosPau.setsPasswordUsuario(infoUserReference.getsPasswordUsuario());
		datosPau.setsReferencia(infoUserReference.getsReferencia());
		datosPau.setsTipoValidacion(infoUserReference.getsTipoValidacion());
		datosPau.setsTokenFisico(infoUserReference.getsTokenFisico());
		datosPau.setsBancoProducto(infoUserReference.getsBancoProducto());
		datosPau.setsProductoServicio(infoUserReference.getsProductoServicio());
		datosPau.setsCodSubProducto(infoUserReference.getsCodSubProducto());
		datosPau.setsNumeroAleatorio(infoUserReference.getsNumeroAleatorio());
		return datosPau;
		
	}

	/**
	 * Info files to delete to files delete info.
	 *
	 * @param infoFilesToDelete the info files to delete
	 * @return the list
	 */
	public static List<FilesDeleteInfo> infoFilesToDeleteToFilesDeleteInfo(InfoFilesToDelete infoFilesToDelete) {
		ValidationUtils.validate(infoFilesToDelete, VALIDATION_ERROR);
		
		List<FilesDeleteInfo> listDeleteInfos = new ArrayList<FilesDeleteInfo>();
		FilesDeleteInfo filesDeleteInfo = null;
		for (InfoFileToDelete infoFileToDelete: infoFilesToDelete.getInfoFilesToDelete()){			
			filesDeleteInfo = new FilesDeleteInfo();
			filesDeleteInfo.setsIdOrden(infoFileToDelete.getsIdOrden());
			filesDeleteInfo.setsTipoOrden(infoFileToDelete.getsTipoOrden());
			listDeleteInfos.add(filesDeleteInfo);
		}
		return listDeleteInfos;
	}

	/**
	 * Components for sign request to firma componente.
	 *
	 * @param components the components
	 * @return the firma componente
	 */
	public static FirmaComponente componentsForSignRequestToFirmaComponente(final ComponentsForSignRequest components) {
		ValidationUtils.validate(components, VALIDATION_ERROR);
		
		
		FirmaComponente fc = new FirmaComponente();
		fc.setsCodOrigen(components.getInfoUserReference().getsCodOrigen());
		fc.setsCodUsuario(components.getInfoUserReference().getsCodUsuario());
		fc.setsNIFUsuario(components.getInfoUserReference().getsNIFUsuario());
		fc.setsTipoFirmante(components.getInfoUserReference().getsTipoFirmante());

		DatosPAU dp = new DatosPAU();
		dp.setsBancoInt(components.getInfoUserReference().getsBancoInt());
		dp.setsBancoProducto(components.getInfoUserReference().getsBancoProducto());
		dp.setsCanal(components.getInfoUserReference().getsCanal());
		dp.setsCodSubProducto(components.getInfoUserReference().getsCodSubProducto());
		dp.setsCodUsuario(components.getInfoUserReference().getsCodUsuarioFirma());
		dp.setsIpCliente(components.getInfoUserReference().getsIpCliente());
		dp.setsIdSession(components.getInfoUserReference().getsIdSession());
		dp.setsIpCliente(components.getInfoUserReference().getsIpCliente());
		dp.setsNumeroAleatorio(components.getInfoUserReference().getsNumeroAleatorio());
		dp.setsPasswordFisico(components.getInfoUserReference().getsPasswordFisico());
		dp.setsPasswordUsuario(components.getInfoUserReference().getsPasswordUsuario());
		dp.setsProductoServicio(components.getInfoUserReference().getsProductoServicio());
		dp.setsReferencia(components.getInfoUserReference().getsReferencia());
		dp.setsTipoValidacion(components.getInfoUserReference().getsTipoValidacion());
		dp.setsTokenFisico(components.getInfoUserReference().getsTokenFisico());
		fc.setDatosPAU(dp);
		
		List<ComponentePutFirma> listCpf = new ArrayList<ComponentePutFirma>();
		ComponentePutFirma cpf = null;
		for(InfoComponent ic : components.getInfoComponents().getInfoComponents()){
			cpf = new ComponentePutFirma();
			cpf.setsIdOrdenFirmas(ic.getsIdOrdenFirmas());
			cpf.setsPoderFirma(ic.getsPoderFirma());
			cpf.setsTipoOrden(ic.getsCodTipoOrden());
			cpf.setsAceptacionDisclaimer(ic.getsAceptacionDisclaimer());
			listCpf.add(cpf);
		}
		fc.setComponentesFirmables(listCpf);

		return fc;
	}

	/**
	 * Info send notification to notifiacion out dto.
	 *
	 * @param info the info
	 * @return the datos pau
	 */
	public static DatosPAU infoSendNotificationToNotifiacionOutDto(final InfoSendNotificationRequest info) {
		ValidationUtils.validate(info, VALIDATION_ERROR);
		
		DatosPAU datosPAU = new DatosPAU();
		datosPAU.setsCanal(info.getsCanal());
		datosPAU.setsBancoInt(info.getsBancoInt());
		datosPAU.setsReferencia(info.getsReferencia());
		datosPAU.setsBancoProducto(info.getsCodBancoProd());
		datosPAU.setsProductoServicio(info.getsCodProducto());
		datosPAU.setsCodSubProducto(info.getsCodSubproducto());
		datosPAU.setsCodUsuario(info.getsCodUsuario());

		String datosContacto = info.getsDatosContacto();
		
		if(datosContacto!=null){
			int posMas=datosContacto.indexOf("+");
			if(posMas!=-1){
				String mas = datosContacto.substring(0,posMas);
			
				if(datosContacto.trim().length()==12){	//+34ddddddddd
					datosContacto = mas + "00" + datosContacto.substring(posMas+1,datosContacto.length());
				}else if(posMas!=-1 && datosContacto.trim().length()==14){ //+0034ddddddddd
					datosContacto = mas + datosContacto.substring(posMas+1,datosContacto.length());				
				}
			}
		}
		datosPAU.setsTelefono(datosContacto);
		datosPAU.setsMensaje(info.getsMensaje());
		datosPAU.setsTipoValidacion(info.getsTipoValidacion());

		return datosPAU;
	}
	
	/**
	 * Creates the fichero info dto from info reference.
	 *
	 * @param info the info
	 * @return the fichero info
	 */
	public static FicheroInfo infoReferenceRequestFacadeToFicheroInfoBo(final InfoReferenceRequest info) {
		ValidationUtils.validate(info, VALIDATION_ERROR);
		
		FicheroInfo ficheroInfo = new FicheroInfo();
		ficheroInfo.setCodAplicacion(info.getsCodOrigen());
		ficheroInfo.setCodClienteCash(info.getsCanal()+info.getsBancoInterno()+info.getsReferencia());
		ficheroInfo.setsPais(info.getsPais());
		return ficheroInfo;
	}
	
	/**
	 * Creates the fich info dto from info deleted file.
	 *
	 * @param info the info
	 * @param usuario the usuario
	 * @return the fichero info
	 */
	public static FicheroInfo infoDeletedFileAndUsuarioInfoToFicheroInfo(final InfoDeletedFile info, UsuarioInfo usuario) {
		ValidationUtils.validate(info, VALIDATION_ERROR);
		
		FicheroInfo ficheroInfo = new FicheroInfo();
		ficheroInfo.setIdOrden(StringUtils.defaultIfEmpty(info.getsIdOrdenFirmas(),null));
		ficheroInfo.setsTipoOrden(new String[]{info.getsTipoOrden()});
		ficheroInfo.setCodClienteCash(usuario.getsCanal()+usuario.getsBancoInt()+usuario.getsReferencia());
		return ficheroInfo;
	}
	
	/**
	 * Creates the fich info dto from info file audit req.
	 *
	 * @param info the info
	 * @return the fichero info
	 */
	public static FicheroInfo infoFileAuditRequestToFicheroInfo(final InfoFileAuditRequest info) {
		ValidationUtils.validate(info, VALIDATION_ERROR);
		FicheroInfo ficheroInfo = new FicheroInfo();
		ficheroInfo.setCodClienteCash(info.getsCanal()+info.getsBancoInt()+info.getsReferencia());
		ficheroInfo.setsTipoOrden(new String[]{info.getsTipoOrden()});
		ficheroInfo.setIdOrden(StringUtils.defaultIfEmpty(info.getsIdOrdenFirmas(),null));		
		return ficheroInfo;
	}
	
	/**
	 * Creates the fich info dto from info file req.
	 *
	 * @param info the info
	 * @return the fichero info
	 */
	public static FicheroInfo infoFileRequestToFicheroInfo(final InfoFileRequest info) {
		ValidationUtils.validate(info, VALIDATION_ERROR);
		
		FicheroInfo ficheroInfo = new FicheroInfo();
		
		//validateNifForHost(info, ficheroInfo);
		
		ficheroInfo.setsTipoFecha(info.getsTipoFecha());
		ficheroInfo.setCodAplicacion(info.getsCodOrigen());
		ficheroInfo.setCodClienteCash(info.getsCanal()+info.getsBancoInt()+info.getsReferencia());
		ficheroInfo.setsReferencia(info.getsReferencia());
		//ficheroInfo.setStipoFirma(info.getsTipoFirma());
		
		if(!StringUtils.isEmpty(info.getsTipoOrden())) {
			String[] tiposOrden = info.getsTipoOrden().split("\\|");
			ficheroInfo.setsTipoOrden(tiposOrden);
		}
		
		if(!StringUtils.isEmpty(info.getsCodEstado())) {
			String[] estados = info.getsCodEstado().split("\\|");
			ficheroInfo.setsCodEstado(estados);
			if(Arrays.asList(estados).contains(UtilFO.ESTADOS_TODOS)) {
				ficheroInfo.setsCodEstado(null);
			} else {
				ficheroInfo.setsCodEstado(new String[estados.length]);
				for (int i=0;i<estados.length;i++) {					
					if(UtilFO.isEstadoHost(estados[i])){
						ficheroInfo.getsCodEstado()[i] = estados[i];
					}else{
						ficheroInfo.getsCodEstado()[i] = UtilFO.getCodNumero(estados[i]);
					}
				}
			}
		}
		
		if(!StringUtils.isEmpty(info.getsNIFUsuario())) {
//			String[] dnis = info.getsNIFUsuario().split("\\|");
//			int i=0;
//				for(String dni:dnis){
//					switch(i){
//						case 0: ficheroInfo.setsNifDni(dni);
//							break;
//						case 1: ficheroInfo.setsNifDni2(dni);
//							break;
//						case 2: ficheroInfo.setsNifDni3(dni);						
//					}
//				 i++;
//				}
			validateNifForHost(info, ficheroInfo);
		}		
		
		if(!StringUtils.isEmpty(info.getsCanal())) {
			ficheroInfo.setCodCanal(info.getsCanal());
		}
	
		if(!StringUtils.isEmpty(info.getsDivisa())) {
			String[] sDivisa = info.getsDivisa().split("\\|");
			ficheroInfo.setsDivisa(sDivisa);
		}
		 
		ficheroInfo.setsFechaDesde(info.getsFechaDesde());
		ficheroInfo.setsFechaHasta(info.getsFechaHasta());
		ficheroInfo.setsImporteDesde(info.getsImporteDesde());
		ficheroInfo.setsImporteHasta(info.getsImporteHasta());
		ficheroInfo.setsUsuarioOrdenante(StringUtils.defaultIfEmpty(info.getsUsuarioOrdenante(), null));
		ficheroInfo.setsPaginacionDesde(info.getsPaginacionDesde());				
		ficheroInfo.setsPaginacionNumElementos(info.getsPaginacionNumElementos());
		ficheroInfo.setsValorOrdenacion(StringUtils.defaultIfEmpty(info.getsValorOrdenacion(), null));							
		ficheroInfo.setsModoOrdenacion(StringUtils.defaultIfEmpty(info.getsModoOrdenacion(),null));
		ficheroInfo.setStipoFirma(StringUtils.defaultIfEmpty(info.getsTipoFirma(),null));
		return ficheroInfo;
	}
	
	/**
	 * Creates the usuario info dto from info user reference.
	 *
	 * @param info the info
	 * @return the usuario info
	 */
	public static UsuarioInfo infoUserReferenceMakingToUsuarioInfo(final InfoUserReferenceMaking info) {
		ValidationUtils.validate(info, VALIDATION_ERROR);
		
		UsuarioInfo usuario = new UsuarioInfo();
		usuario.setsCodUsuario(info.getsCodUsuario());
		usuario.setsBancoInt(info.getsBancoInt());
		usuario.setsCanal(info.getsCanal());
		usuario.setsReferencia(info.getsReferencia());
		return usuario;
	}
	
	/**
	 * Creates the fichero info dto from info filtered signer.
	 *
	 * @param info the info
	 * @return the fichero info
	 */
	public static FicheroInfo infoFilteredSignersRequestToFicheroInfo(final InfoFilteredSignersRequest info) {
		ValidationUtils.validate(info, VALIDATION_ERROR);
		FicheroInfo ficheroInfo = new FicheroInfo();
		ficheroInfo.setCodClienteCash(info.getsCanal() + info.getsBancoInt() + info.getsReferencia());
		ficheroInfo.setsBancoProducto(info.getsBancoPr());
		ficheroInfo.setsCodSubproducto(info.getsSubProdu());
		ficheroInfo.setsBancoAsunto(info.getsBancoAsunto());
		ficheroInfo.setsCodProducto(info.getsCodProducto());
		ficheroInfo.setStipoFirma(info.getsTipoFirma());
		ficheroInfo.setIdOrden(StringUtils.defaultIfEmpty(info.getsIdOrdenFirmas(),null));
		ficheroInfo.setCodCanal(info.getsCanal());
		ficheroInfo.setsTipoOrden(new String[]{info.getsTipoOrden()});
		ficheroInfo.setCodServicio(info.getsServicio());
		return ficheroInfo;
	}
	
	public static UpdateInfoInDto infoUpdateNumOutToUpdateInfoIn(final InfoUpdateNumeroAleatorioRequest info) {
		ValidationUtils.validate(info, VALIDATION_ERROR);			
		ValidationUtils.validarObligatorios(new Object[]{info, 
											info.getInfoOrdenes(), 
											info.getInfoOrdenes().getInfoOrden(), 
											info.getInfoUserReferenceUpdate(), 
											info.getInfoUserReferenceUpdate().getsTipoFirma(), 
											info.getInfoUserReferenceUpdate().getsCanal(),
											info.getInfoUserReferenceUpdate().getsBancoInt(),
											info.getInfoUserReferenceUpdate().getsReferencia(),
											info.getInfoUserReferenceUpdate().getsCodOrigen(),
											info.getInfoUserReferenceUpdate().getsBancoProducto(),
											info.getInfoUserReferenceUpdate().getsProductoServicio(),
											info.getInfoUserReferenceUpdate().getsCodSubProducto(),
											info.getInfoUserReferenceUpdate().getsNIFUsuario(),
											info.getInfoUserReferenceUpdate().getsCodUsuario(),											
											info.getInfoUserReferenceUpdate().getsTipoFirmante(),
											info.getInfoUserReferenceUpdate().getsProductoServicio()},
											VALIDATION_ERROR, true);
		
		UpdateInfoInDto updateInfo = new UpdateInfoInDto();		
		ArrayList<InfoOrdenInDto> idOrdenes = new ArrayList<InfoOrdenInDto>();
		
		updateInfo.setsTipoFirma(info.getInfoUserReferenceUpdate().getsTipoFirma());	
		updateInfo.setsCanal(info.getInfoUserReferenceUpdate().getsCanal());
		updateInfo.setsBancoInt(info.getInfoUserReferenceUpdate().getsBancoInt());
		updateInfo.setsReferencia(info.getInfoUserReferenceUpdate().getsReferencia());
		updateInfo.setsBancoProducto(info.getInfoUserReferenceUpdate().getsBancoProducto());
		updateInfo.setsCodSubProducto(info.getInfoUserReferenceUpdate().getsCodSubProducto());	
		updateInfo.setsProductoServicio(info.getInfoUserReferenceUpdate().getsProductoServicio());				
		updateInfo.setsCodUsuario(info.getInfoUserReferenceUpdate().getsCodUsuario());
		updateInfo.setsNIFUsuario(info.getInfoUserReferenceUpdate().getsNIFUsuario());			
		updateInfo.setsTipoFirmante(info.getInfoUserReferenceUpdate().getsTipoFirmante());
		updateInfo.setsCodigoAplicacion(info.getInfoUserReferenceUpdate().getsCodOrigen());
		for (InfoOrden infoOrden : info.getInfoOrdenes().getInfoOrden()) {
			ValidationUtils.validarObligatorios(new Object[]{infoOrden.getsIdOrdenFirmas(), 
															 infoOrden.getsPoderFirma()}, VALIDATION_ERROR, true); 
			InfoOrdenInDto infoOrdenDto = new InfoOrdenInDto();
			infoOrdenDto.setsIdOrdenFirmas(infoOrden.getsIdOrdenFirmas());
			infoOrdenDto.setsPoderFirma(infoOrden.getsPoderFirma());
			
			idOrdenes.add(infoOrdenDto);
		}
		updateInfo.setInfoOrdenes(idOrdenes);
		return updateInfo;
	}
	
	/**
	 * Creates the fich info dto from info file req usu.
	 *
	 * @param info the info
	 * @return the fichero info
	 */
	public static FicheroInfo infoFileDetailedRequestToFicheroInfo(final InfoFileDetailedRequest info){
		ValidationUtils.validate(info, VALIDATION_ERROR);
		
		FicheroInfo ficheroInfo = new FicheroInfo();
		
		validateNifForHost(info, ficheroInfo);
		
		ficheroInfo.setCodAplicacion(info.getsCodOrigen());
		ficheroInfo.setCodClienteCash(info.getsCanal() + info.getsBancoInt() + info.getsReferencia());
		ficheroInfo.setCodCanal(info.getsCanal());
		
		if(!StringUtils.isEmpty(info.getsTipoOrden())) {
			String[] tiposOrden = info.getsTipoOrden().split("\\|");
			ficheroInfo.setsTipoOrden(tiposOrden);
		}
		
		if(!StringUtils.isEmpty(info.getsCodEstado())) {
			String[] estados = info.getsCodEstado().split("\\|");
			ficheroInfo.setsCodEstado(estados);
			if(Arrays.asList(estados).contains(UtilFO.ESTADOS_TODOS)) {
				ficheroInfo.setsCodEstado(null);
			} else {
				ficheroInfo.setsCodEstado(new String[estados.length]);
				for (int i=0;i<estados.length;i++) {
					ficheroInfo.getsCodEstado()[i] = UtilFO.getCodNumero(estados[i]);
				}
			}
		}
		
		if (!StringUtils.isEmpty(info.getsDivisa())) {
			String[] sDivisa = info.getsDivisa().split("\\|");
			ficheroInfo.setsDivisa(sDivisa);
		}
		
		ficheroInfo.setsFechaDesde(info.getsFechaDesde());
		ficheroInfo.setsFechaHasta(info.getsFechaHasta());
		ficheroInfo.setsImporteDesde(info.getsImporteDeste());
		ficheroInfo.setsImporteHasta(info.getsImporteHasta());
		ficheroInfo.setsUsuarioOrdenante(info.getsUsuarioOrdenante());
		ficheroInfo.setsTipoFecha(info.getsTipoFecha());
		ficheroInfo.setsCodUsuario(info.getsCodUsuario());
		ficheroInfo.setsBancoProducto(info.getsCodBancoProd());
		ficheroInfo.setsCodProducto(info.getsCodProducto());
		ficheroInfo.setsCodSubproducto(info.getsCodSubproducto());
		ficheroInfo.setCodCanal(info.getsCanal());
		
		//El rango de paginacion se pasa tal cual pues es de tipo int y siempre esta inicializado por defecto a 0
		// No vamos a paginar todavia, ya que tenemos un problema al realizar el between en el DAO y posteriormente filtrar los resultados
		// mediante la logica de negocio del BO
		 ficheroInfo.setsPaginacionDesde(info.getiPaginacionDesde());				
		 ficheroInfo.setsPaginacionNumElementos(info.getiPaginacionNumElementos());
		
		if(!StringUtils.isEmpty(info.getsValorOrdenacion())) {
			ficheroInfo.setsValorOrdenacion(info.getsValorOrdenacion());							
		}			
		if(!StringUtils.isEmpty(info.getsModoOrdenacion())) {
			ficheroInfo.setsModoOrdenacion(info.getsModoOrdenacion());
		}
		
		return ficheroInfo;
	}

	/**
	 * Creates the fich info dto from info signer.
	 *
	 * @param info the info
	 * @return the fichero info
	 */
	public static FicheroInfo infoSignersRequestToFicheroInfo(final InfoSignersRequest info){
		ValidationUtils.validate(info, VALIDATION_ERROR);
		
		FicheroInfo ficheroInfo = new FicheroInfo();
		ficheroInfo.setCodClienteCash(info.getsCanal()+info.getsBancoInt()+info.getsReferencia());
		ficheroInfo.setsTipoOrden(info.getsTipoOrden().split("\\|"));
		ficheroInfo.setIdOrden(StringUtils.defaultIfEmpty(info.getsIdOrdenFirmas(),null));
		return ficheroInfo;
	}
	
	/**
	 * Info component detail to info component detail dto.
	 *
	 * @param info the info
	 * @return the info component in dto
	 */
	public static InfoComponentInDto infoComponentDetailToInfoComponentDetailDto(final InfoComponentRequest info) {
		ValidationUtils.validate(info, VALIDATION_ERROR);
		InfoComponentInDto infoCompDetDto = new InfoComponentInDto();
		infoCompDetDto.setsIdOrdenFirmas(info.getsIdOrdenFirmas());
		infoCompDetDto.setsCodTipoOrden(info.getsCodTipoOrden());
		infoCompDetDto.setsCodOrigen(info.getsCodOrigen());
		infoCompDetDto.setsMostrarOrdenes(info.getsMostrarOrdenes());
		infoCompDetDto.setsIdioma(info.getsIdioma());
		return infoCompDetDto;
	}
	
	/**
	 * Validate nif for host.
	 *
	 * @param info the info
	 * @param ficheroInfo the fichero info
	 */
	private static void validateNifForHost(final ITipoFirmaAndNIF info, final FicheroInfo ficheroInfo) {
		if(StringUtils.isBlank(info.getsNIFUsuario())) {
			if (info.getsTipoFirma().equals(ConstantesFO.SIGLAS_FIRMA_HOST)) {
				throw new ExcepcionEjecucionAplicacion(VALIDATION_ERROR);
			}
		} else {
			String[] nifs = info.getsNIFUsuario().split("\\|");
				
			if(nifs.length==3) {
				ficheroInfo.setsNifDni(nifs[0]);
				ficheroInfo.setsNifDni2(nifs[1]);
				ficheroInfo.setsNifDni3(nifs[2]);
				
			}else if(nifs.length==2) {
				ficheroInfo.setsNifDni(nifs[0]);
				ficheroInfo.setsNifDni2(nifs[1]);
				ficheroInfo.setsNifDni3("");
			}
			else if (info.getsTipoFirma().equals(ConstantesFO.SIGLAS_FIRMA_HOST)) {
				throw new ExcepcionEjecucionAplicacion(VALIDATION_ERROR);	
			}
		}
	}
}
